package com.markchu.web.structure.controller;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.read.listener.PageReadListener;
import com.alibaba.excel.util.ListUtils;
import com.markchu.common.utils.ResultVoUtil;
import com.markchu.common.vo.ResultVo;
import com.markchu.modules.system.domain.ExportExcelResult;
import com.markchu.modules.system.service.ExportExcelResultService;
import com.markchu.web.structure.test.DemoCostData;
import com.markchu.web.structure.test.DemoData;
import com.markchu.web.structure.test.TestFileUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.function.Consumer;

@Controller
@RequestMapping("/home/export")
public class ExcelExportController {

    @Autowired
    private ExportExcelResultService exportExcelResultService;

    @GetMapping("/index")
    public String index() throws InterruptedException {

        return "/excel/index";
    }
    @PostMapping("/upload")
    @ResponseBody
    public void upload(@RequestParam("file") MultipartFile multipartFile) throws IOException {
        EasyExcel.read(multipartFile.getInputStream());
        System.out.println(multipartFile);
        System.out.println("--------");

        // 这里默认每次会读取100条数据 然后返回过来 直接调用使用数据就行
        // 具体需要返回多少行可以在`PageReadListener`的构造函数设置
        EasyExcel.read(multipartFile.getInputStream(), DemoData.class, new PageReadListener<DemoData>(new Consumer<List<DemoData>>() {
            @Override
            public void accept(List<DemoData> list) {
                for (DemoData demoData : list) {
                    System.out.println(demoData);
                }
            }
        }, 100)).sheet().doRead();
    }

    @GetMapping("/excel")
    @ResponseBody
    public ResultVo loadUserInfo(String typeCode,String checkMain) throws InterruptedException {
        List<ExportExcelResult> dataList = exportExcelResultService.findAll();
        List<DemoData> demoDataList = new ArrayList<>();
        for(ExportExcelResult tempData : dataList){
            DemoData demoData = new DemoData();
            demoData.setOrgName(tempData.getOrgName());
            demoData.setOrgUser(tempData.getOrgUser());
            demoData.setOrgBy(tempData.getOrgBy());
            demoData.setOrgFren(tempData.getOrgFren());
            demoData.setOrgMain(checkMain);
            demoDataList.add(demoData);
        }
        Map<String,List<DemoData>> dataMapList = new HashMap<>();
        List<DemoData> results = null;
        for(DemoData demoData : demoDataList){
            String keyCode = demoData.getOrgName();
            if(dataMapList.containsKey(keyCode)){
                results = dataMapList.get(keyCode);
            }else{
                results = new ArrayList<>();
            }
            results.add(demoData);
            dataMapList.put(keyCode,results);
        }
        System.out.println("dataList"+dataList.size());
        System.out.println("dataMapList"+dataMapList.size());

        for(String keyCode : dataMapList.keySet()){
            List<DemoData> excelList = dataMapList.get(keyCode);
            System.out.println("key="+keyCode+" vlaue="+excelList.size());
            String fileName = "/Users/chuchu/Documents/idea/excel/"+typeCode+"/"+checkMain+"/"+ keyCode + ".xlsx";
            if(typeCode.equals("法人单位")){
                EasyExcel.write(fileName, DemoData.class).sheet(keyCode).doWrite(excelList);
            }else{
                EasyExcel.write(fileName, DemoCostData.class).sheet(keyCode).doWrite(excelList);
            }
        }

        return ResultVoUtil.success();
    }

    public static void main(String[] args) {
        int i = (2 << 3);
        System.out.println(i);

//        simpleWrite();
//        templateWrite();
//        String fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
//        ExcelWriter excelWriter = EasyExcel.write(fileName).build();
//        WriteSheet writeSheet = EasyExcel.writerSheet("测试").build();
//        writeSheet.setStartRow(2);
//        excelWriter.write(data(), writeSheet);
//        excelWriter.finish();

    }


    public static void templateWrite() {
        String templateFileName = TestFileUtil.getPath() + "demo" + File.separator + "demo.xlsx";
        String fileName = TestFileUtil.getPath() + "templateWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        // 这里要注意 withTemplate 的模板文件会全量存储在内存里面，所以尽量不要用于追加文件，如果文件模板文件过大会OOM
        // 如果要再文件中追加（无法在一个线程里面处理，可以在一个线程的建议参照多次写入的demo） 建议临时存储到数据库 或者 磁盘缓存(ehcache) 然后再一次性写入
        EasyExcel.write(fileName, DemoData.class).withTemplate(templateFileName).sheet("1234567").doWrite(data());
    }

    private static List<DemoData> data() {
        List<DemoData> list = ListUtils.newArrayList();
        for (int i = 0; i < 10; i++) {
            DemoData data = new DemoData();
            data.setOrgBy("字符串" + i);
            data.setOrgName("sdfsd");
            data.setOrgFren("sdfds");
            data.setOrgName("ingnore");
            list.add(data);
        }
        return list;
    }

    public static void simpleWrite(String keyCode,List<DemoData> dataList) {
        // 注意 simpleWrite在数据量不大的情况下可以使用（5000以内，具体也要看实际情况），数据量大参照 重复多次写入

        // 写法1 JDK8+
        // since: 3.0.0-beta1
        String fileName = TestFileUtil.getPath() + keyCode + ".xlsx";
        System.out.println(fileName);
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, DemoData.class)
                .sheet(keyCode)
                .doWrite(() -> {
                    // 分页查询数据
                    return dataList;
                });

//        // 写法2
//        fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
//        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
//        // 如果这里想使用03 则 传入 excelType 参数即可
//        EasyExcel.write(fileName, DemoData.class).sheet("模板").doWrite(data());
//
//        // 写法3
//        fileName = TestFileUtil.getPath() + "simpleWrite" + System.currentTimeMillis() + ".xlsx";
//        // 这里 需要指定写用哪个class去写
//        try (ExcelWriter excelWriter = EasyExcel.write(fileName, DemoData.class).build()) {
//            WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
//            excelWriter.write(data(), writeSheet);
//        }
    }

}
